package net.loyin.util.image;
import java.awt.image.BufferedImage;
import java.io.BufferedOutputStream;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;

import javax.imageio.ImageIO;
/**
 * 图片合并
 */
public class AddWatermark
{
	/**
	  * 获得原始图片的Image对象
	  */
	private BufferedImage OriginalImage = null;
	private String Original;
	private String Append;
	
	private int OriginalWidth;  // 原始图片宽
	private int OriginalHeigth;  // 原始图片的高
	private int AppendWidth;  // 添加图片的宽
	private int AppendHeigth;  // 添加图片的高
	private int X;  // 添加图片的位X位置
	private int Y;  // 添加图片的位Y位置
	private String saveas;  // 保存路径
	
	/**
	 * @param saveas the saveas to set
	 */
	public void setSaveas(String saveas) {
		this.saveas = saveas;
	}

	private BufferedImage AppendImage = null;
	
	/**
	 * 坐标
	 * 上左(默认)
	 * <pre>
	 *    # * *
	 *    * * *
	 *    * * *
	 * </pre>
	 */
	public static final int COORDINATE_UP_LEFT = 1;
	/**
	 * 坐标
	 * 上中
	 * <pre>
	 *    * # *
	 *    * * *
	 *    * * *
	 * </pre>
	 */
	public static final int COORDINATE_UP_MIDDLE = 2;
	/**
	 * 坐标
	 * 中左
	 * <pre>
	 *    * * *
	 *    # * *
	 *    * * *
	 * </pre>
	 */
	public static final int COORDINATE_UP_RIGHT = 3;
	/**
	 * 坐标
	 * 上右
	 * <pre>
	 *    * * #
	 *    * * *
	 *    * * *
	 * </pre>
	 */
	public static final int COORDINATE_MIDDLE_LEFT = 4;
	/**
	 * 坐标
	 * X居中Y居中
	 * <pre>
	 *    * * *
	 *    * # *
	 *    * * *
	 * </pre>
	 */
	public static final int COORDINATE_MIDDLE_MIDDLE = 5;
	/**
	 * 坐标
	 * 中右
	 * <pre>
	 *    * * *
	 *    * * #
	 *    * * *
	 * </pre>
	 */
	public static final int COORDINATE_MIDDLE_RIGHT = 6;
	/**
	 * 坐标
	 * 下左
	 * <pre>
	 *    * * *
	 *    * * *
	 *    # * *
	 * </pre>
	 */
	public static final int COORDINATE_DOWN_LEFT = 7;
	/**
	 * 坐标
	 * 下中
	 * <pre>
	 *    * * *
	 *    * * *
	 *    * # *
	 * </pre>
	 */
	public static final int COORDINATE_DOWN_MIDDLE = 8;
	/**
	 * 坐标
	 * 下右
	 * <pre>
	 *    * * *
	 *    * * *
	 *    * * #
	 * </pre>
	 */
	public static final int COORDINATE_DOWN_RIGHT = 9;
	public AddWatermark(){}
	/**
	 * @param originalWidth the originalWidth to set
	 */
	protected void setOriginalWidth(int originalWidth) {
		OriginalWidth = originalWidth;
	}

	/**
	 * @param appendWidth the appendWidth to set
	 */
	protected void setAppendWidth(int appendWidth) {
		AppendWidth = appendWidth;
	}

	/**
	 * @param appendHeigth the appendHeigth to set
	 */
	protected void setAppendHeigth(int appendHeigth) {
		AppendHeigth = appendHeigth;
	}
	
	public AddWatermark(String Original, String Append)
	{
		this.Original=Original;
		this.Append=Append;
	}
	
	/**
	 * @param originalImage the originalImage to set
	 */
	protected void setOriginalImage(BufferedImage originalImage) {
		OriginalImage = originalImage;
	}
	
	/**
	 * @param originalHeigth the originalHeigth to set
	 */
	protected void setOriginalHeigth(int originalHeigth) {
		OriginalHeigth = originalHeigth;
	}
	
	/**
	 * @param appendImage the appendImage to set
	 */
	protected void setAppendImage(BufferedImage appendImage) {
		AppendImage = appendImage;
	}
	 
	 
 	/**原始图片的高
	 * @return the originalHeigth
	 */
	protected int getOriginalHeigth() {
		return OriginalHeigth;
	}
 
	/**添加图片的宽
	 * @return the appendWidth
	 */
	protected int getAppendWidth() {
		return AppendWidth;
	}
	
	/**添加图片的高
	 * @return the appendHeigth
	 */
	protected int getAppendHeigth() {
		return AppendHeigth;
	}
		
	/**
	 * 原始图片的宽
	 * @return
	 */
	protected int getOriginalWidth() 
	{
		return OriginalWidth;
	}
	 
	/**
	 * 获得添加图片的信息
	 * @return
	 */
	protected BufferedImage getAppendImage()
	{
		return this.AppendImage;
	}
	 
	/**
	 * 获得原始图片的Image对象
	 * @return
	 */
	public BufferedImage getOriginalImage()
	{
		return this.OriginalImage;
	}
	
	/**
	 * 获得原始图片的地址
	 * @return
	 */
	public String getOriginal() {
		return Original;
	}

	/**
	 * 设置原始图片的路径
	 * @param originalImage
	 */
	public void setOriginalImage(String originalImage) {
		Original = originalImage;
	}
	
	/**
	 * 获得追加的图片路径
	 * @return
	 */
	public String getAppend() {
		return Append;
	}
	
	/**
	 * 设置追加的图片路径
	 * @param appendImage
	 */
	public void setAppendImage(String appendImage) 
	{
		Append = appendImage;
	}
	
	/**
	 *获得原始图片信息
	 * @return 成功返回true 否则返回false 
	 */
	protected void readOriginalImage() throws Exception
	{
		if ( this.OriginalImage == null )
		{
			this.OriginalImage = ImageIO.read( new File( this.Original ) );
			if ( OriginalImage != null )
			{
				this.OriginalWidth = this.OriginalImage.getWidth();
				this.OriginalHeigth = this.OriginalImage.getHeight();
			}
		}
			
	}
	
	/**
	 * 获得添加图片的信息
	 * @return 成功返回true 否则返回false 
	 */
	protected boolean readAppendImage()
	{
		boolean succeedread=false;
		try 
		{
			if ( this.AppendImage == null )
			{
				this.AppendImage = ImageIO.read( new File( this.Append ) );
			}
			
			if ( AppendImage != null )
			{
				this.AppendHeigth = this.AppendImage.getHeight();
				this.AppendWidth = this.AppendImage.getWidth();
				succeedread = true;
			}
		} 
		catch (IOException e)
		{
			succeedread=false;
			e.printStackTrace();
		}
		
		return succeedread;
	}
	
	/**
	 * 合并图片
	 * <pre>
	 * 也就是说把原始图片和追加图片合并处理并写生成一个新的图片
	 * </pre>
	 * @param x 添加到图片会放到x坐标指定的原始图片的位置上
	 * @param y 添加到图片会放到y坐标指定的原始图片的位置上
	 * @param saveas 将合并好的文件保存到saveas指定的路径下
	 * @throws Exception 
	 */
	public void Merger(int x,int y,String saveas) throws Exception
	{
		this.X = x;
		this.Y = y;
		MergerImage(saveas);
	}
	
	/**
	 * 合并图片
	 * <pre>
	 * 也就是说把原始图片和追加图片合并处理并写生成一个新的图片
	 * </pre>
	 * @param saveas  合并图片的保存地址
	 * @return
	 */
	public void  Merger(String saveas) throws Exception
	{
		MergerImage( saveas );
	}
	
	/**
	 * 合并图片
	 * <pre>
	 * 也就是说把原始图片和追加图片合并处理并写生成一个新的图片
	 * </pre>
	 * @param saveas
	 */
	private  void  MergerImage(String saveas)throws Exception
	{
		this.saveas = saveas;
		if(this.AppendImage==null)
		{
			this.readAppendImage();
		}
		
		if ( this.OriginalImage == null )
		{
			this.readOriginalImage();
		}
		
		this.OriginalImage.getGraphics().drawImage( this.AppendImage, X, Y, null );
		save( null, 0, 0 );
	}
	
	/**
	 * 保存
	 * @param image
	 * @param x
	 * @param y
	 * @throws Exception
	 */
	protected void save(BufferedImage image,int x,int y)throws Exception
	{
		if ( image != null )
		{
			OriginalImage = image;
		}
			
		if ( x > 0 )
		{
			X = x;
		}
			
		if ( y > 0 )
		{
			Y = y;
		}
			
		BufferedOutputStream outputStream = null;
		try 
		{
			FileOutputStream stream = new FileOutputStream( saveas );
			outputStream = new BufferedOutputStream( stream );
			ImageIO.write( OriginalImage, "jpg", outputStream );
		} 
		catch (Exception e) 
		{
			e.printStackTrace();
			throw new Exception( e.getMessage() );
		}
		finally
		{
			if ( outputStream != null )
			{
				try {
					outputStream.close();
				} catch (IOException e) {
					e.printStackTrace();
				}
			}
				
		}
	}
	
	/**
	 * 设置坐标位置
	 */
	public  void setCoordinate(int parm) throws Exception 
	{	
		
		this.readAppendImage();
		this.readOriginalImage();
		switch(parm)
		{
			case 1:  // 上左
			this.X = 0;
			this.Y = 0;
			break;
			case 2:  // 上中
				this.X = ( this.OriginalWidth - this.AppendWidth ) / 2;
				this.Y = 0;
			break;
			case 3:  // 上右
				this.X = ( this.OriginalWidth - this.AppendWidth );
				this.Y = 0;
				break;
			case 4:  // 中左
				this.X = 0;
				this.Y = ( this.OriginalHeigth - this.AppendHeigth ) / 2;
				break;
			case 5:  // 居中
				this.X = ( this.OriginalWidth - this.AppendWidth ) / 2;
				this.Y = ( this.OriginalHeigth - this.AppendHeigth ) / 2;
				break;
			case 6:  // 中右
				this.X = ( this.OriginalWidth - this.AppendWidth );
				this.Y = ( this.OriginalHeigth - this.AppendHeigth ) / 2;
				break;
			case 7:  // 下左
				this.X = 0;
				this.Y = ( this.OriginalHeigth - this.AppendHeigth );
				break;
			case 8:  // 下中
				this.X = ( this.OriginalWidth - this.AppendWidth ) / 2;
				this.Y = ( this.OriginalHeigth - this.AppendHeigth );
				break;
			case 9:  // 下右
				this.X = this.OriginalWidth - this.AppendWidth;
				this.Y = this.OriginalHeigth - this.AppendHeigth;
				break;
		}
		
		X = Math.abs( X ) - 10;
		Y = Math.abs( Y ) - 10;
	}
	
}
